; Exercicio 1.29

(define (cubo x) (* x x x))

(define (somatorio termo a prox b)
  (if (> a b)
      0
      (+ (termo a)
         (somatorio termo (prox a) prox b))))

; Integral original:
(define (integral f a b dx)
  (define (soma-dx x) (+ x dx))
  (* (somatorio f (+ a (/ dx 2.0)) soma-dx b)
     dx))

; Exercicio: Integral com base na regra de Simpson
; http://en.wikipedia.org/wiki/Simpson%27s_rule
(define (integral-simpson f a b n)
  (integral-simpson-h f a n (/ (- b a) n)))
; O valor de b só preciso pra calcular o h.
; Passo o h como parâmetro pra auxiliar pois assim não preciso
; ficar calculando...
(define (integral-simpson-h f a n h)
  (define (incrementa x) (+ x 1))
  ; A função fator decide se multiplica o termo por 1, 2 ou 4.
  (define (fator j)
    (cond ((or (= j 0) (= j n)) 1)
          ((even? j) 2)
          (else 4)))
  ; O termo do somatório em si
  (define (termo j)
    (* (fator j) (f (+ a (* j h)))))

  (* (/ h 3)
     (somatorio termo
                0
                incrementa
                n)))
